---
title: "Lisp笔记"
categories:
- lisp
tags:
---

<div id="content">
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org1bf2695">Lisp (LISt Procesor)</a>
<ul>
<li><a href="#org96d8baf">函数</a>
<ul>
<li><a href="#org4e2fab1">表达式</a></li>
<li><a href="#org0c6f577">SETQ变量赋值</a></li>
<li><a href="#org01f4f1b">逻辑运算</a></li>
</ul>
</li>
<li><a href="#org531f8c3">表，CAR，CDR</a>
<ul>
<li><a href="#org4f49614">表和原子</a></li>
<li><a href="#org08fcc07">表和表达式</a></li>
<li><a href="#org2a263e2">表操作</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="outline-2" id="outline-container-org1bf2695">
<h2 id="org1bf2695">Lisp (LISt Procesor)</h2>
<div class="outline-text-2" id="text-org1bf2695">
<p>
Lisp的全名叫“表处理语言”，LISt Procesor 。
</p>
<ul class="org-ul">
<li>不区分在小写</li>
<li>注释作用分号</li>
</ul>
</div>
<div class="outline-3" id="outline-container-org96d8baf">
<h3 id="org96d8baf">函数</h3>
<div class="outline-text-3" id="text-org96d8baf">
</div>
<div class="outline-4" id="outline-container-org4e2fab1">
<h4 id="org4e2fab1">表达式</h4>
<div class="outline-text-4" id="text-org4e2fab1">
<p>
LISP中使用 前缀表示法，也被叫做 波兰表示法。数学表达式要用括号括起来，并且运算符要放在第一个，运算数放在后面，中间用必要的空格隔开。
例如：
</p>
<div class="org-src-container">
<pre class="src src-lisp">(+ 1 2) <span style="font-weight: bold; font-style: italic;">; equals to 1 + 2</span>
(- 3 2) <span style="font-weight: bold; font-style: italic;">; equals to 3 - 1</span>
(/ 8 6) <span style="font-weight: bold; font-style: italic;">; equals to 8 / 6，结果是“4/3”，LISP使用了分数表示结果</span>
(* (+ 2 4) 7)<span style="font-weight: bold; font-style: italic;">; equals to (2 + 4) * 7</span>
(sqrt 9) <span style="font-weight: bold; font-style: italic;">; 函数调用也是这种方式，相当于 sart(9)</span>
(log 16 2) <span style="font-weight: bold; font-style: italic;">; 函数调用，log(16, 2)</span>
</pre>
</div>
</div>
</div>
<div class="outline-4" id="outline-container-org0c6f577">
<h4 id="org0c6f577">SETQ变量赋值</h4>
<div class="outline-text-4" id="text-org0c6f577">
<div class="org-src-container">
<pre class="src src-lisp">(setq a 5)
</pre>
</div>
</div>
</div>
<div class="outline-4" id="outline-container-org01f4f1b">
<h4 id="org01f4f1b">逻辑运算</h4>
<div class="outline-text-4" id="text-org01f4f1b">
<p>
在 LISP 中，T 代表逻辑真，而 NIL 代表逻辑假。
</p>
<div class="org-src-container">
<pre class="src src-lisp">(&lt; 3 4) <span style="font-weight: bold; font-style: italic;">; result is T</span>
</pre>
</div>
<p>
逻辑运算符有 {% raw %} AND {% endraw %} {% raw %} OR {% endraw %}
</p>
<div class="org-src-container">
<pre class="src src-lisp">(and T T)
(OR T NIL)
</pre>
</div>
</div>
</div>
</div>
<div class="outline-3" id="outline-container-org531f8c3">
<h3 id="org531f8c3">表，CAR，CDR</h3>
<div class="outline-text-3" id="text-org531f8c3">
</div>
<div class="outline-4" id="outline-container-org4f49614">
<h4 id="org4f49614">表和原子</h4>
<div class="outline-text-4" id="text-org4f49614">
<p>
用小括号括起来的表达式式就叫表。例如：
</p>
<div class="org-src-container">
<pre class="src src-lisp">(+ 1 2)
</pre>
</div>
<p>
表里面的东西，就是原子。原子就是不包含空格的符号，可以是字符，也可以是数字。
上面的表中包含了三个原子：+ 1 2。比如，下面的这个表里，有两个原子。 
</p>
<div class="org-src-container">
<pre class="src src-lisp">'(hello world) <span style="font-weight: bold; font-style: italic;">; 前面有一个单引号，在下面有介绍</span>
</pre>
</div>
<p>
表是能够嵌套的，也就是表中的元素也能是另外一个表，例如：
</p>
<div class="org-src-container">
<pre class="src src-lisp">(or (&gt; 3 4) (&gt; 4 2))
</pre>
</div>
<p>
空的表 {% raw %} () {% endraw %} 其中没有任何元素。
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org08fcc07">
<h4 id="org08fcc07">表和表达式</h4>
<div class="outline-text-4" id="text-org08fcc07">
<p>
表和表达式都是用括号，看起来形式一样的。表是数据，表达式是程序，程序与数据是编程中的两大要素，在 Lisp 中，这两者都用 表 来表示。 
在所有的表中，第一个原子表示函数、操作、指令。而之后的元素是参数。
</p>
<p>
如果在解释器中输入一个表，那么Lisp会对这个表求值。所以在解释器中输入 {% raw %} (+ 1 2) {% endraw %} 会打印3。
而在解释器中输入 {% raw %} (1 2 3) {% endraw %} ，这只是一个表，解释器报1不是函数的错误。
</p>
<p>
用一个单引号操作符以防止对表的求值。就像上面的 hello world表那样。单引号其实只是一个语法糖————quote的简写，hello world的完全体就是：
</p>
<div class="org-src-container">
<pre class="src src-lisp">(quote (Hello world!))
</pre>
</div>
</div>
</div>
<div class="outline-4" id="outline-container-org2a263e2">
<h4 id="org2a263e2">表操作</h4>
<div class="outline-text-4" id="text-org2a263e2">
</div>
<ul class="org-ul">
<li><a id="org3b0e817"></a>CAR<br/>
<div class="outline-text-5" id="text-org3b0e817">
<p>
CAR操作符的作用是返回表的第一个元素，但并不会移除该元素。全称是Contents of Address Register。（黑人问号）
first是CAR的别名，毕竟first比汽车直观点。例如：
</p>
<div class="org-src-container">
<pre class="src src-lisp">(car '(1 2 3 4 5)) <span style="font-weight: bold; font-style: italic;">; 记得那个引号，没有了引号，lisp就去执行里边的数组了</span>
</pre>
</div>
</div>
</li>
<li><a id="org5cfcf4a"></a>CDR<br/>
<div class="outline-text-5" id="text-org5cfcf4a">
<p>
移除表中的第一个元素。
</p>
</div>
</li>
<li><a id="org85d37f6"></a>CONS<br/>
<div class="outline-text-5" id="text-org85d37f6">
<p>
连接一个元素与一个表（顺序不可颠倒）。例如 {% raw %} (cons 1 '(2 3)) {% endraw %} 结果为 {% raw %} (1 2 3) {% endraw %}
</p>
</div>
</li>
<li><a id="org530c454"></a>append<br/>
<div class="outline-text-5" id="text-org530c454">
<p>
连接多个个表
</p>
</div>
</li>
<li><a id="orgce5c08b"></a>LIST<br/>
<div class="outline-text-5" id="text-orgce5c08b">
<p>
将所有参数连接成一个表
</p>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="status" id="postamble">
<p class="author">Author: gdme1320</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
